import axios from 'axios'
// 在非组件模块拿到store 必须这样导出来使用
import store from '@/store/'
import jsonBig from 'json-bigint'
import { Toast } from 'vant'
import router from '@/router/'

const refreshTokenReq = axios.create({
  baseURL: 'http://api-toutiao-web.itheima.net'
})

const request = axios.create({
  baseURL: 'http://api-toutiao-web.itheima.net',
  transformResponse: [function (data) {
    try {
      // 如果转换成功则返回转换的数据结果
      return jsonBig.parse(data)
    } catch (err) {
      // 如果转换失败，则包装为统一数据格式并返回
      return {
        data
      }
    }
  }]
})

// 请求拦截器
// Add a request interceptor
request.interceptors.request.use(function (config) {
  // Do something before request is sent
  const { user } = store.state

  // 如果用户已登录，统一给接口设置 token 信息
  if (user) {
    config.headers.Authorization = `Bearer ${user.token}`
  }

  // 处理完之后一定要把 config 返回，否则请求就会停在这里
  return config
}, function (error) {
  // Do something with request error
  return Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(response => {
  return response
}, async function (error) {
  // 不是 2xx的响应码进入这里
  const status = error.response.status
  if (status === 401) {
    const { user } = store.state
    if (!user || !user.token) {
      return redirectLogin()
    }
    try {
      const { data } = await refreshTokenReq({
        method: 'PUT',
        url: '/app/v1_0/authorizations',
        headers: {
          Authorization: `Bearer ${user.refresh_token}`
        }
      })
      user.token = data.data.token
      store.commit('setUser', user)
      return request(error.config)
    } catch (error) {
      redirectLogin()
    }
  } else if (status === 403) {
    Toast.fail('没有权限')
  } else if (status === 400) {
    Toast.fail('客户端请求参数异常')
  } else if (status >= 500) {
    Toast.fail('服务端异常,请稍后重试')
  }
  return Promise.reject(error)
})
function redirectLogin () {
  router.replace({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

export default request
